import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import config from '@/config'
// import { checkLogin, redirectToLogin } from '@/utils/auth' // 假设有登录校验工具函数

// 声明合并扩展Axios类型
declare module 'axios' {
  interface AxiosRequestConfig {
    showLoading?: boolean
    ignoreAuth?: boolean
  }
}

// 环境变量类型
interface EnvConfig {
  VITE_API_BASE_URL: string
}

// 自定义请求配置类型，扩展 AxiosRequestConfig
interface CustomRequestConfig extends AxiosRequestConfig {
  customProperty?: string; // 示例：添加自定义属性
}

// 统一响应数据结构 (根据后端约定修改)
interface ApiResponse<T = any> {
  code: number
  data: T
  msg: string
}

// 扩展请求配置类型（可选）
interface CustomRequestConfig extends AxiosRequestConfig {
  showLoading?: boolean // 是否显示加载提示
  ignoreAuth?: boolean // 是否忽略Token校验
}

const env = import.meta.env as unknown as EnvConfig

class Request {
  private instance: AxiosInstance
  private loadingCount = 0 // 加载提示计数器

  constructor() {
    this.instance = axios.create({
      baseURL: config.baseURL + '/api/',
      timeout: 10000,
    })

    // 全局请求拦截器
    this.instance.interceptors.request.use(
      (config) => {
        // 确保 headers 存在
        config.headers = config.headers || {}

        // 展示加载提示（可自定义UI）
        if (config.showLoading !== false) {
          this.showLoading()
        }

        // Token处理
        if (!config.ignoreAuth) {
          const token = uni.getStorageSync('token')
          if (token) {
            config.headers.Authorization = `Bearer ${token}`
          } else {
            // 根据需求处理无Token情况
            // redirectToLogin()
          }
        }
        return config
      },
      (error: AxiosError) => {
        this.hideLoading()
        return Promise.reject(error)
      }
    )

    // 全局响应拦截器
    this.instance.interceptors.response.use(
      (response: AxiosResponse<ApiResponse>) => {
        this.hideLoading()

        const res = response.data
        if (res.code === -1) {
          console.log('跳转登录页面,待跳转登录页面');
          // 抛出错误到业务层
          return Promise.reject(new Error(res.msg || '请求失败'))
        } else {
          return res.data
        }
      },
      (error: AxiosError) => {
        this.hideLoading()
        
        // 处理HTTP错误状态码
        const status = error.response?.status
        let message = '请求错误'
        
        switch (status) {
          case 400:
            message = '请求参数错误'
            break
          case 401:
            message = '登录已过期'
            // redirectToLogin()
            break
          case 500:
            message = '服务器错误'
            break
        }

        // 显示错误提示（可替换为uni.showToast）
        uni.showModal({
          title: '提示',
          content: message,
          showCancel: false
        })

        return Promise.reject(error)
      }
    )
  }

  // 显示加载提示（防抖）
  private showLoading() {
    if (this.loadingCount === 0) {
      uni.showLoading({
        title: '加载中',
        mask: true
      })
    }
    this.loadingCount++
  }

  // 隐藏加载提示
  private hideLoading() {
    this.loadingCount--
    if (this.loadingCount <= 0) {
      uni.hideLoading()
      this.loadingCount = 0
    }
  }

  // 封装GET方法
  public get<T = any>(url: string, config?: CustomRequestConfig): Promise<T> {
    return this.instance.get(url, config)
  }

  // 封装POST方法
  public post<T = any>(
    url: string,
    data?: any,
    config?: CustomRequestConfig
  ): Promise<T> {
    return this.instance.post(url, data, config)
  }

  // 可继续封装其他方法（PUT/DELETE等）
}

export default new Request()